home *** CD-ROM | disk | FTP | other *** search
- /*
- MacTech Programmers Challenge - December 94
-
- SolveRubiksCube
- Copyright (c) 1994 J Robert Boonstra
- */
- /*
- * TYPEDEFS and DEFINES
- */
-
- typedef struct CubeSide {
- char littleSquare[3][3];
- } CubeSide;
-
- typedef struct MikeCube {
- CubeSide face[6];
- } MikeCube;
-
- /* face ordering in MikeCube */
- enum {kTop=0, kLeft, kFront, kRight, kBottom, kBack};
-
- typedef struct RubiksCube {
- char cubie[16][8];
- char origCube[16][8];
- char theMove[512];
- } RubiksCube, *RubiksCubePtr;
-
- /* face ordering in RubiksCube */
- enum { F=0,L,R,B,U,D,f,l,r,b,u,d};
-
- /*
- * Macros Front(x) give access to individual cubies on the
- * Front face. Similarly for other faces.
- */
- #define Front(x) rub->cubie[x][0]
- #define Left(x) rub->cubie[x][1]
- #define Right(x) rub->cubie[x][2]
- #define Back(x) rub->cubie[x][3]
- #define Up(x) rub->cubie[x][4]
- #define Down(x) rub->cubie[x][5]
-
- /*
- * Set up symbols to represent individual cubie faces
- */
- #define ULF_F Front(0)
- #define UF_F Front(1)
- #define URF_F Front(2)
- #define LF_F Front(3)
- #define RF_F Front(5)
- #define DLF_F Front(6)
- #define DF_F Front(7)
- #define DRF_F Front(8)
-
- #define ULB_L Left(0)
- #define UL_L Left(1)
- #define ULF_L Left(2)
- #define LB_L Left(3)
- #define LF_L Left(5)
- #define DLB_L Left(6)
- #define DL_L Left(7)
- #define DLF_L Left(8)
-
- #define URF_R Right(0)
- #define UR_R Right(1)
- #define URB_R Right(2)
- #define RF_R Right(3)
- #define RB_R Right(5)
- #define DRF_R Right(6)
- #define DR_R Right(7)
- #define DRB_R Right(8)
-
- #define DLF_D Down(0)
- #define DF_D Down(1)
- #define DRF_D Down(2)
- #define DL_D Down(3)
- #define DR_D Down(5)
- #define DLB_D Down(6)
- #define DB_D Down(7)
- #define DRB_D Down(8)
-
- #define DLB_B Back(0)
- #define DB_B Back(1)
- #define DRB_B Back(2)
- #define LB_B Back(3)
- #define RB_B Back(5)
- #define ULB_B Back(6)
- #define UB_B Back(7)
- #define URB_B Back(8)
-
- #define ULB_U Up(0)
- #define UB_U Up(1)
- #define URB_U Up(2)
- #define UL_U Up(3)
- #define UR_U Up(5)
- #define ULF_U Up(6)
- #define UF_U Up(7)
- #define URF_U Up(8)
-
- /*
- *
- * Macro M(x) records the individual turns in the
- * transformation for playback during subsequent calls
- * to SolveRubiksCube.
- */
- #define M(x) *theMoveP++ = x;
-
- #define Rot2(a,b) \
- {register char tmp; tmp=a; a=b; b=tmp;}
-
- #define Rot3(a,b,c) \
- {register char tmp; tmp=a; a=b; b=c; c=tmp;}
-
- #define Rot4(a,b,c,d) \
- {register char tmp; tmp=a; a=b; b=c; c=d; d=tmp;}
-
- #define Rot5(a,b,c,d,e) \
- {register char tmp; tmp=a; a=b; b=c; c=d; d=e; e=tmp;}
-
- #define Rot6(a,b,c,d,e,f) \
- {register char tmp; tmp=a; a=b; b=c; c=d; d=e; e=f; f=tmp;}
-
- #define Rot7(a,b,c,d,e,f,g) \
- {register char tmp;tmp=a;a=b;b=c;c=d;d=e;e=f;f=g;g=tmp;}
-
- #define Rot8(a,b,c,d,e,f,g,h) \
- {register char tmp;tmp=a;a=b;b=c;c=d;d=e;e=f;f=g;g=h;h=tmp;}
-
- #define Rot9(a,b,c,d,e,f,g,h,i) \
- {register char tmp;tmp=a;a=b;b=c;c=d;d=e;e=f;f=g;g=h;h=i; \
- i=tmp;}
-
- #define Rot10(a,b,c,d,e,f,g,h,i,j) \
- {register char tmp;tmp=a;a=b;b=c;c=d;d=e;e=f;f=g;g=h;h=i; \
- i=j;j=tmp;}
-
- #define Rot12(a,b,c,d,e,f,g,h,i,j,k,l) \
- {register char tmp;tmp=a;a=b;b=c;c=d;d=e;e=f;f=g;g=h;h=i; \
- i=j;j=k;k=l;l=tmp;}
-
- #define Rot15(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o) \
- {register char tmp;tmp=a;a=b;b=c;c=d;d=e;e=f;f=g;g=h;h=i; \
- i=j;j=k;k=l;l=m;m=n;n=o;o=tmp;}
-
- #define Rot16(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p) \
- {register char tmp;tmp=a;a=b;b=c;c=d;d=e;e=f;f=g;g=h;h=i; \
- i=j;j=k;k=l;l=m;m=n;n=o;o=p;p=tmp;}
-
- #define CornerEquals(X,Y,Z,a,b,c) \
- ((X##Y##Z##_##X==a||X##Y##Z##_##X==b||X##Y##Z##_##X==c) && \
- (X##Y##Z##_##Y==a||X##Y##Z##_##Y==b||X##Y##Z##_##Y==c) && \
- (X##Y##Z##_##Z==a||X##Y##Z##_##Z==b||X##Y##Z##_##Z==c))
-
- #define CornerCorrect(X,Y,Z) \
- ((X##Y##Z##_##X==X||X##Y##Z##_##X==Y||X##Y##Z##_##X==Z) && \
- (X##Y##Z##_##Y==X||X##Y##Z##_##Y==Y||X##Y##Z##_##Y==Z) && \
- (X##Y##Z##_##Z==X||X##Y##Z##_##Z==Y||X##Y##Z##_##Z==Z))
-
- /*
- * PROTOTYPES
- */
- int SolveRubiksCube(RubiksCube *cubePtr);
- int FindSolution(void);
-
- void MikeCubeToRubiksCube(MikeCube *mikePtr,
- RubiksCube *rubikPtr);
- void RubiksCubeToMikeCube(RubiksCube *rubikPtr,
- MikeCube *mikePtr);
- void SolveTopEdgesFR(RubiksCube *rubPtr);
- void SolveTopEdgesLB(RubiksCube *rubPtr);
- Boolean SolveTopCorners(RubiksCube *rubPtr);
- Boolean SolveMiddleLayer(RubiksCube *rubPtr);
- Boolean SolveBottomCorners(RubiksCube *rubPtr);
- Boolean SolveBottomEdges(RubiksCube *rubPtr);
- Boolean LegalCube(RubiksCube *rubPtr);
-
- extern char *theMoveP; /* pointer to stored moves */
- extern short firstTime;
-
-